package arithmetic;

import java.util.Scanner;

/**
 * HJ32 密码截取
 * 解题思路：ABA， ABBA，字符串左右对称
 * 描述
 * Catcher是MCA国的情报员，他工作时发现敌国会用一些对称的密码进行通信，比如像这些ABBA，ABA，A，123321，但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214　。因为截获的串太长了，而且存在多种可能的情况（abaaab可看作是aba,或baaab的加密形式），Cathcer的工作量实在是太大了，他只能向电脑高手求助，你能帮Catcher找出最长的有效密码串吗？
 *
 * 数据范围：字符串长度满足 1≤n≤2500
 * 输入描述：
 * 输入一个字符串（字符串的长度不超过2500）
 *
 * 输出描述：
 * 返回有效密码串的最大长度
 *
 * 示例1
 * 输入：
 * ABBA
 * 复制
 * 输出：
 * 4
 * 复制
 * 示例2
 * 输入：
 * ABBBA
 * 复制
 * 输出：
 * 5
 * 复制
 * 示例3
 * 输入：
 * 12HHHHA
 * 复制
 * 输出：
 * 4
 */
public class TestHW32 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = "";
        while (in.hasNextLine()) {
            str = in.nextLine();
        }
        if (str.length() < 1 || str.length() > 2500)return;
        int result = traversalString(str);
        System.out.println(result);
    }

    public static int traversalString(String str) {
        int result = 0;
        int index = 0;
        while (index < str.length()) {
            String subStr = str.substring(index, str.length());
            int len = dealWithString(subStr, 0);
            result = Math.max(result, len);
            index++;
        }
        return result;
    }

    public static int dealWithString(String str, int len) {
        StringBuffer subPre = new StringBuffer();
        StringBuffer subAft = new StringBuffer();
        char ch = str.charAt(0);
        int lastIndex = str.lastIndexOf(ch);
        if (lastIndex == 0) {
            len = Math.max(len, 1);
            return len;
        } else {
            int length = lastIndex + 1;
            int subIndex = length / 2;
            if (length % 2 == 0) {
                subPre.append(str.substring(0,  subIndex));
                subAft.append(str.substring( subIndex, lastIndex + 1));
            } else {
                subPre.append(str.substring(0,  subIndex));
                subAft.append(str.substring( subIndex + 1, lastIndex + 1));
            }
            if (subPre.toString().equals(subAft.reverse().toString())) {
                len = Math.max(len, length);
                return len;
            } else {
                str = str.substring(0, lastIndex);
            }
            return dealWithString(str, len);
        }
    }
}
